package com.ocom.netty.mj;

import com.ocom.netty.mj.service.JNASM2Dll;
import com.ocom.netty.mj.util.NumConvertUtil;

import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;

public class Sm2 {

    public static void main(String[] args){
        System.out.println(JNASM2Dll.instanceDll.add(1,2));

        byte[] data4=new byte[32];
        byte[] data5=new byte[32];
        byte[] data6=new byte[32];
        byte[] signByte=new byte[64];
        try {
//            System.out.println(JNASM2Dll.instanceDll.sm2_make_key(data4,data5,data6));
//            System.out.println(NumConvertUtil.bytesToHexString(data4));
//            System.out.println(NumConvertUtil.bytesToHexString(data5));
//            System.out.println(NumConvertUtil.bytesToHexString(data6));
            /**
             * 00000000000000000000000002b0e6c800000000000000000000000002b0e5c8
             * 000000005282fc1400000000bc21548f000000008ce0bab800000000824cd132
             * 00000000835bb863000000004efd1ea90000000058fb47bb00000000307d7fdc
             */
            byte[]  p_privateKey = NumConvertUtil.hexStringToByte("00000000000000000000000002b0e6c800000000000000000000000002b0e5c8");
            byte[]  p_publicKey_X = NumConvertUtil.hexStringToByte("000000005282fc1400000000bc21548f000000008ce0bab800000000824cd132");
            byte[]  p_publicKey_Y = NumConvertUtil.hexStringToByte("00000000835bb863000000004efd1ea90000000058fb47bb00000000307d7fdc");

            System.out.println(p_privateKey.length);

            System.out.println(JNASM2Dll.instanceDll.sm2_sign(p_privateKey,p_publicKey_Y,signByte));

            System.out.println(NumConvertUtil.bytesToHexString(signByte));

//            byte[] KeyX = new byte[]{(byte)0x5C,(byte)0x70,(byte)0x5F,(byte)0xC9,(byte)0x31,(byte)0xAB,(byte)0x77,(byte)0xD0,(byte)0xA9,(byte)0x04,(byte)0xEE,(byte)0x54,(byte)0x4D,(byte)0x7E,(byte)0xDB,(byte)0xEA,(byte)0xA6,(byte)0x02,(byte)0x83,(byte)0xFB,(byte)0xD5,(byte)0xE9,(byte)0x72,(byte)0x02,(byte)0x74,(byte)0x3D,(byte)0x3C,(byte)0xB5,(byte)0x42,(byte)0x18,(byte)0x7B,(byte)0xC3};
//            byte[] KeyY = new byte[]{(byte)0x8A,(byte)0x18,(byte)0xA2,(byte)0x87,(byte)0x9B,(byte)0xC7,(byte)0x6F,(byte)0xD4,(byte)0x46,(byte)0xD0,(byte)0x83,(byte)0xC8,(byte)0xAC,(byte)0x02,(byte)0x23,(byte)0x73,(byte)0x29,(byte)0xB5,(byte)0xA1,(byte)0xFE,(byte)0x53,(byte)0x7A,(byte)0x2B,(byte)0x5F,(byte)0x5C,(byte)0xA1,(byte)0x00,(byte)0xBB,(byte)0x48,(byte)0xE1,(byte)0xC8,(byte)0x73};
//
//            byte[]  temp =new byte[]{(byte)0x9E,(byte)0x4E,(byte)0x01,(byte)0x17,(byte)0x06,(byte)0x49,(byte)0x29,(byte)0x9F,(byte)0x9E,(byte)0x6F,(byte)0xE6,(byte)0xF3,(byte)0x2D,(byte)0x7A,(byte)0xE2,(byte)0xB6};
//            byte[]  sign =new byte[]{(byte)0x70,(byte)0x22,(byte)0x00,(byte)0x1f,(byte)0xf0,(byte)0xca,(byte)0x7f,(byte)0x51,(byte)0x43,(byte)0xf8,(byte)0x02,(byte)0x31,(byte)0x83,(byte)0x4b,(byte)0x11,(byte)0x1b,(byte)0x1a,(byte)0x3e,(byte)0x86,(byte)0x05,(byte)0xae,(byte)0x82,(byte)0x70,(byte)0xd1,(byte)0x19,(byte)0x86,(byte)0xcf,(byte)0x53,(byte)0x28,(byte)0x06,(byte)0x60,(byte)0x47,(byte)0x6b,(byte)0x20,(byte)0xc9,(byte)0xe6,(byte)0xaa,(byte)0x96,(byte)0xdc,(byte)0xbc,(byte)0x1f,(byte)0xb7,(byte)0x0a,(byte)0x91,(byte)0x4c,(byte)0xe4,(byte)0x4a,(byte)0x8e,(byte)0x04,(byte)0x9b,(byte)0x7f,(byte)0xbe,(byte)0x2f,(byte)0xc3,(byte)0xa4,(byte)0x30,(byte)0x15,(byte)0x47,(byte)0x21,(byte)0x39,(byte)0x6c,(byte)0x6b,(byte)0x7b,(byte)0xaa};
//
//            byte[]  md5 = new byte[]{(byte)0x96,(byte) 0x92,(byte) 0x88,(byte) 0x24,(byte) 0x98,(byte) 0x65,(byte) 0x60,(byte) 0x55};
//
//
//            System.out.println(JNASM2Dll.instanceDll.sm2_verify(KeyX,KeyY, Md5Utils.getMD5(md5).getBytes(StandardCharsets.UTF_8),sign));
   //         System.out.println(JNASM2Dll.instanceDll.sm2_verify(getChars(KeyX),getChars(KeyY), getChars(temp),getChars(sign)));
//            System.out.println(JNASM2Dll.instanceDll.sm2_verify("5C705FC931AB77D0A904EE544D7EDBEAA60283FBD5E97202743D3CB542187BC3","8A18A2879BC76FD446D083C8AC02237329B5A1FE537A2B5F5CA100BB48E1C873","4D62D327AC6ADF950BCB87FDEB463E27","0c7f37ceaff295291234b95206e7ba90301e27f5f8970396778f0b710de73d53a95fcdad29e7630295eb77372f4e823cbf8d33c3fae222fdbe78f0d88a91d543".toUpperCase()));
        }catch (Exception e){
            System.out.println(e.getMessage());
        }

//        JNASM2Dll.instanceDll.sm2_make_key(data4,data5, data6);
//        JNASM2Dll.instanceDll.sm2_sign(c1,data2, data3);
    }

    public static char[] getChars(byte[] bytes) {
        Charset cs = Charset.forName("UTF-8");
        ByteBuffer bb = ByteBuffer.allocate(bytes.length);
        bb.put(bytes);
        bb.flip();
        CharBuffer cb = cs.decode(bb);
        return cb.array();
    }



}
